var FancyWebSocket = function (url)
{
    var callbacks = {};
    var ws_url = url;
    var conn;

    this.bind = function (event_name, callback) {
        callbacks[event_name] = callbacks[event_name] || [];
        callbacks[event_name].push(callback);
        return this;// chainable
    };

    this.send = function (event_name, event_data) {
        this.conn.send(event_data);
        return this;
    };

    this.connect = function () {
//        if (typeof (MozWebSocket) == 'function')
//            this.conn = new MozWebSocket(url);
//        else
//            this.conn = new WebSocket(url);
        this.conn = new WebSocket(url);
        
        // dispatch to the right handlers
        this.conn.onmessage = function (evt) {
            dispatch('message', evt.data);
        };

        this.conn.onclose = function () {
            dispatch('close', null)
        }
        this.conn.onopen = function () {
            dispatch('open', null)
        }
    };

    this.disconnect = function () {
        this.conn.close();
    };

    var dispatch = function (event_name, message) {
        var chain = callbacks[event_name];
        if (typeof chain == 'undefined')
            return; // no callbacks for this event
        for (var i = 0; i < chain.length; i++) {
            chain[i](message)
        }
    }
};